/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package entidades;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
import javax.persistence.OneToOne;
import javax.persistence.OneToMany;
import java.util.List;
import java.util.ArrayList;
import javax.persistence.CascadeType;


/**
 *
 * @author REX
 */
@Entity
@Table(name = "usuario", catalog = "inscripciones", schema = "")
@NamedQueries({
    @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"),
    @NamedQuery(name = "Usuario.findByIdUsuario", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario"),
    @NamedQuery(name = "Usuario.findByPassword", query = "SELECT u FROM Usuario u WHERE u.password = :password")})
public class Usuario{
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column( length = 32,name="id_usuario")
    private String idUsuario;
    @Basic(optional = false)
    @Column(name = "password", nullable = false, length = 32)
    private String password;
    @Transient
    private String passwordCopiaTemp;

    @OneToOne(mappedBy= "usuario",cascade={CascadeType.ALL})
    private InformacionUsuario informacionUsuario;

    @OneToMany(mappedBy = "usuario", cascade = {CascadeType.ALL})
    private List<Grupo> grupos;


    public void addGrupo(Grupo grupo){
        if(this.grupos == null){
            grupos = new ArrayList<Grupo>();
        }
        
        grupos.add(grupo);
    }

    public List<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(List<Grupo> grupo) {
        this.grupos = grupo;
    }

    public InformacionUsuario getInformacionUsuario() {
        if(informacionUsuario == null){
            informacionUsuario = new InformacionUsuario();
            
        }
        return informacionUsuario;
    }

    public void setInformacionUsuario(InformacionUsuario informacionUsuario) {
        this.informacionUsuario = informacionUsuario;
    }
    
    public String getPasswordCopiaTemp() {
        return passwordCopiaTemp;
    }

    public void setPasswordCopiaTemp(String passwordCopiaTemp) {
        this.passwordCopiaTemp = passwordCopiaTemp;
    }
    
    public Usuario() {
       // this.informacionUsuario = new InformacionUsuario();
    }

    public Usuario(String idUsuario) {
        this.idUsuario = idUsuario;
    }
   
    public Usuario(String idUsuario, String password) {
        this.idUsuario = idUsuario;
        this.password = password;
    }

    public String getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(String idUsuario) {

        this.idUsuario = idUsuario;
    }

    public String getPassword() {
        return password;
    }
    
    
    public void setPassword(String password) throws UnsupportedEncodingException  {
        final StringBuilder cadenaHexadecimal = new StringBuilder();
        this.passwordCopiaTemp = password;
        try{ 
            byte[] passwordBytes = password.getBytes("UTF-8");
            MessageDigest algoritmo = MessageDigest.getInstance("MD5");
            algoritmo.reset();
            algoritmo.update(passwordBytes);
            byte[] md = algoritmo.digest();
           
            for(byte elemento : md){
                cadenaHexadecimal.append(Character.forDigit((elemento>>4)&0xf,16));
                cadenaHexadecimal.append(Character.forDigit(elemento & 0xf, 16));
            }

            this.password = (cadenaHexadecimal.toString());

        }
        catch(NoSuchAlgorithmException nsae ){

        }

        

       
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idUsuario != null ? idUsuario.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.idUsuario == null && other.idUsuario != null) || (this.idUsuario != null && !this.idUsuario.equals(other.idUsuario))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return idUsuario;
    }
    
    


}
